/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.comp.manager;

import com.brain.comp.dto.PcDetaItemDto;
import com.brain.comp.dto.PedidoCompraDetaDto;
import com.brain.comp.dto.PedidoCompraDto;
import com.brain.comp.dto.SolicitudCompraDetaDto;
import com.brain.comp.dto.SolicitudCompraDto;
import com.brain.comp.view.util.ConstantesComp;
import com.brain.conf.manager.*;
import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.CondicionPagoDto;
import com.brain.conf.dto.TarifaDto;
import com.brain.conf.dto.TarifaProductoDto;
import com.brain.conf.dto.TerceroDireccionDto;
import com.brain.conf.dto.TerceroDto;
import com.brain.conf.dto.TipoCambioDto;
import com.brain.conf.view.util.ConstantesConf;
import com.brain.core.common.ExportarExcelCompras;
import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.core.view.util.ConstantesCore;
import com.brain.inve.view.util.ConstantesInve;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import net.sf.jasperreports.engine.JRException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class PedidoCompraManager extends ComunManager<PedidoCompraDto> implements Serializable {

    private static Logger logger = Logger.getLogger(PedidoCompraManager.class);
    private Long idEntidad = 170L;
    @Resource
    private DAOGenerico<PedidoCompraDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ApplicationMBean applicationMBean;
    @Resource
    private AlmacenUbicacionManager auManager;
    private final String url = "/pages/comp/pedidoCompra/pedidoCompra.xhtml";
    private final String urlLista = "/pages/comp/pedidoCompra/listaPedidosCompra.xhtml";
    private final String urlListaSolicitudes = "/pages/comp/pedidoCompra/listaSolicitudesCompraConfirmadas.hxtml";
    private final String urlNecesidadPedido = "/pages/comp/pedidoCompra/necesidadPedido.xhtml";

    /**
     * obtener Pedidos de Compra por Id
     *
     * @param id
     * @return Pedido Compra
     * @throws DAOException
     */
    public PedidoCompraDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(PedidoCompraDto.class, id);
    }

    /**
     * Metodo para inicializar nuevo Pedido de Compra
     *
     * @return
     */
    public PedidoCompraDto inicializar() {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        PedidoCompraDto dto = new PedidoCompraDto();
        dto.setDocumentoTransaccion(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_DOCTRANSAC_OC);
        dto.setEstadoDocumento(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_DOC_PE);
        dto.setEmpresaDto(sessionMBean.getEmpresaDto());
        dto.setProveedorDto(new TerceroDto());
        dto.setAlmacenDto(new AlmacenDto());
        dto.setFormaPagoDto(new ParametroDto());
        dto.setCondicionPagoDto(new CondicionPagoDto());
        dto.setTarifaDto(new TarifaDto());
        dto.setFechaPedido(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setDescuento(BigDecimal.ZERO);
        dto.setDescuentoMonto(BigDecimal.ZERO);
        dto.setSubTotal(BigDecimal.ZERO);
        dto.setSubTotalConDescuento(BigDecimal.ZERO);
        dto.setImpuesto(BigDecimal.ZERO);
        dto.setImpuestoMonto(BigDecimal.ZERO);
        dto.setSubTotal(BigDecimal.ZERO);
        dto.setTotal(BigDecimal.ZERO);
        dto.setConfirmar(Boolean.FALSE);
        dto.setSubTotalAtendido(BigDecimal.ZERO);
        if (sessionMBean.getOrganizacionDto() != null) {
            if (sessionMBean.getOrganizacionDto().getId() != null) {
                dto.setOrganizacionDto(sessionMBean.getOrganizacionDto());
                if (sessionMBean.getOrganizacionDto().getPaisDto().getImpuestoVentas() != null) {
                    dto.setImpuesto(sessionMBean.getOrganizacionDto().getPaisDto().getImpuestoVentas());
                }
                //Obtenemos la moneda del pais de la organizacion   
                dto.setMonedaDto(sessionMBean.getOrganizacionDto().getMonedaDto());
            }
        }
        dto.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ELABORACION);
        return dto;
    }

    /**
     * Metodo para obtener Pedido de Compra segun filtro
     *
     * @param dtoFiltro
     * @return Lista de Pedidos de Compra
     * @throws DAOException
     */
    public List<PedidoCompraDto> obtener(PedidoCompraDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from PedidoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescProveedor() != null && dtoFiltro.getDescProveedor().length() != 0) {
            hqsql += " and (upper(e.proveedorDto.descripcion) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%'";
            hqsql += " or upper(e.proveedorDto.numeroDocumento) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%')";
        }

        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {

            hqsql += " and e.fechaPedido between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }

        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }


        if (dtoFiltro.getEstado() != null && dtoFiltro.getEstado().length() != 0 && !dtoFiltro.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_TODOS)) {
            hqsql += " and upper(e.estado) = '" + dtoFiltro.getEstado() + "'";
        }


        hqsql += " order by e.fechaPedido,fechaComprometida  desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PedidoCompraDto> obtenerConfirmados(PedidoCompraDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from PedidoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescProveedor() != null && dtoFiltro.getDescProveedor().length() != 0) {
            hqsql += " and (upper(e.proveedorDto.descripcion) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%'";
            hqsql += " or upper(e.proveedorDto.numeroDocumento) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%')";
        }

        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {

            hqsql += " and e.fechaPedido between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }

        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }
        hqsql += " and upper(e.estado) = '" + ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO + "'";
        hqsql += " and upper(e.estadoDocumento) <> '" + ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_DOC_AT + "'";
        //No puede se puede generar un doc compra de un pedido de compra que ya tenga asociado otro doc de compra en estado ELABORACION
        hqsql += " and not exists(select 'X' from DocumentoCompraDto as d where d.pedidoCompraDto.id = e.id and upper (d.estado) = '" + ConstantesComp.ValoresConstantes.DOC_COMPRA_COD_ESTADO_ELABORACION + "')";
        hqsql += " order by e.fechaConfirmacion desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PedidoCompraDto> obtenerConfirmadosParaGuiaRemision(PedidoCompraDto dtoFiltro) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from PedidoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescProveedor() != null && dtoFiltro.getDescProveedor().length() != 0) {
            hqsql += " and (upper(e.proveedorDto.descripcion) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%'";
            hqsql += " or upper(e.proveedorDto.numeroDocumento) like '%" + dtoFiltro.getDescProveedor().toUpperCase() + "%')";
        }

        if (dtoFiltro.getFechaInicio() != null && dtoFiltro.getFechaFin() != null) {

            hqsql += " and e.fechaPedido between ? and ?";
            Calendar c = Calendar.getInstance();
            c.setTime(dtoFiltro.getFechaInicio());
            c.set(Calendar.HOUR, 0);
            c.set(Calendar.MINUTE, 0);
            c.set(Calendar.SECOND, 0);
            listaParametros.add(c.getTime());
            c.setTime(dtoFiltro.getFechaFin());
            c.set(Calendar.HOUR, 23);
            c.set(Calendar.MINUTE, 59);
            c.set(Calendar.SECOND, 59);
            listaParametros.add(c.getTime());
        }

        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }
        hqsql += " and upper(e.estado) = '" + ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO + "'";
        //Esta linea se ha comentado ya que se va generar MOVIMIENTO a todos los pedidos de compra, por que
        //Ningun documento que tenga origen se podra visualizar como origen en los MOVIMIENTOS
        //hqsql += " and not exists(select 'X' from DocumentoCompraDto as d where d.pedidoCompraDto.id = e.id)";

        //Verificamos que ningun item de este pedido este en una guia de remsion con estado GENERADA
        hqsql += " and not exists(select 'X' from GuiaRemisionDetaDto as grd ";
        hqsql += " where grd.pedidoCompraDetaDto.pedidoCompraDto.id = e.id ";
        hqsql += " and grd.guiaRemisionDto.estado = '" + ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_ELABORACION + "')";
        //Verificamos si existe algun item que aun no haya sido atendido completamente
        hqsql += " and exists(select 'X' from PedidoCompraDetaDto as pcd";
        hqsql += " where pcd.pedidoCompraDto.id = e.id and (pcd.estado = '" + ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DETA_COD_ESTADO_REC_PARCIAL + "' ";
        hqsql += " or pcd.estado = '" + ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DETA_COD_ESTADO_EN_ESPERA + "') and pcd.productoDetaDto.productoDto.tipoProducto <> '" + ConstantesConf.ValoresConstantes.PRODUCTO_COD_TIPO_SERVICIO + "')";

        hqsql += " order by e.fechaConfirmacion desc";
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    public List<PedidoCompraDto> obtenerPedidosPorNroSerieNumero(PedidoCompraDto dto) throws DAOException {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        String hqsql = "select e from PedidoCompraDto as e where e.id=e.id ";
        List<Object> listaParametros = new ArrayList<Object>();
        hqsql += " and e.nroSerie = '" + dto.getNroSerie() + "'";
        hqsql += " and e.numero = '" + dto.getNumero() + "' ";
        hqsql += " and e.empresaDto.id = ?";
        listaParametros.add(sessionMBean.getEmpresaDto().getId());
        if (sessionMBean.getOrganizacionDto() != null && sessionMBean.getOrganizacionDto().getId() != null) {
            hqsql += " and e.organizacionDto.id = ?";
            listaParametros.add(sessionMBean.getOrganizacionDto().getId());
        }
        if (dto.getId() != null) {
            hqsql += " and e.id <> ?";
            listaParametros.add(dto.getId());
        }
        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);
    }

    /**
     * Metodo para guardar, editar Pedidos de Compra
     *
     * @param dto Pedido de Compra
     * @return cadena de satisfaccion
     */
    public String guardar(PedidoCompraDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");
        SolicitudCompraManager solicitudCompraManager = (SolicitudCompraManager) WebServletContextListener.getApplicationContext().getBean("solicitudCompraManager");
        SolicitudCompraDetaManager solicitudCompraDetaManager = (SolicitudCompraDetaManager) WebServletContextListener.getApplicationContext().getBean("solicitudCompraDetaManager");
        try {
            if (dto.getOrganizacionDto() != null) {
                if (!verificarUniqueNroSerieNumero(dto)) {
                    return null;
                }
                //Antes de guardar los datos verificamos si los detalles se han ingresado correctamente
                if (dto.getListaDetalles() != null) {
                    if (!dto.getListaDetalles().isEmpty()) {
                        for (PedidoCompraDetaDto hijo : dto.getListaDetalles()) {
                            if (!hijo.getIsSave()) {
                                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.tipo.cambio.prod.detalles"));
                                return null;
                            }
                            UtilCore.General.toUpperCaseDto(hijo);
                            hijo.setPedidoCompraDto(dto);
                        }
                    }
                }

                {
                    dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                    dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                    dto.setTerminal(sessionMBean.getSessionTerminal());
                }
                //Definimos el color de la fila segun el estado
                definirCssPorEstado(dto);
                if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
                    dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                    dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                    dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                    UtilCore.General.toUpperCaseDto(dto);
                    //Redondeamos el subTotal
                    nuevo(dto);
                    //Si proviene de una sol de compra hay que hacer la referencia en esa tabla
                    if (dto.getSolicitudCompraDto() != null) {
                        SolicitudCompraDto solCompDto = solicitudCompraManager.obtenerPorId(dto.getSolicitudCompraDto().getId());
                        solCompDto.setPedidoCompraDto(dto);
                        solicitudCompraManager.editar(solCompDto);
                        List<SolicitudCompraDetaDto> lstScdDto = new ArrayList<SolicitudCompraDetaDto>();
                        for (PedidoCompraDetaDto x : dto.getListaDetalles()) {
                            SolicitudCompraDetaDto scdDto = solicitudCompraDetaManager.obtenerPorId(x.getSolicitudCompraDetaDto().getId());
                            scdDto.setPedidoCompraDetaDto(x);
                            lstScdDto.add(scdDto);
                        }
                        solicitudCompraDetaManager.nuevoMuchos(lstScdDto);
                    }
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);

                    to = "";//retroceder();

                } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
                    UtilCore.General.toUpperCaseDto(dto);
                    editar(dto);
                    mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                    recursosManager.showMessage(mensajeTrx);
                    to = "";//retroceder();
                }

            } else {
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.no.organizacion");
                recursosManager.showError(mensajeTrx);
                to = null;
            }
        } catch (Exception ex) {
            mensajeTrx = ex.getMessage();
            recursosManager.showError(ex.getMessage());
            logger.error(mensajeTrx);

            to = null;
        }
        return to;
    }    
    
    public String obtenerCadenaUltimaModificacionLista(PedidoCompraDto dto) {
        String cad = "";
        int diasDif = UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate());
        if (diasDif == 0) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hoy.a.las") + " " + sdf.format(dto.getFecha());            
        }
        else if (diasDif == 1) {
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.ayer.a.las") + " " + sdf.format(dto.getFecha());
        }
        else if (diasDif >1 && diasDif < 7) {
            int diaSemana = 0;
            String diaTexto = "";
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(UtilCore.Fecha.obtenerFechaActualDate());;
            SimpleDateFormat sdf = new SimpleDateFormat(com.brain.core.common.ConstantesCore.formatoHora);
            if (calendario.get(Calendar.DAY_OF_WEEK) > diasDif) {
                diaSemana = calendario.get(Calendar.DAY_OF_WEEK) - diasDif;
            }
            else {
                diaSemana = 7 - Math.abs(calendario.get(Calendar.DAY_OF_WEEK) - diasDif);                
            }
            diaTexto = obtenerDiaSemanaTexto(diaSemana);
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.el") + " " + diaTexto + " " + sdf.format(dto.getFecha());
        }
        else {
            Calendar calendario = Calendar.getInstance();
            calendario.setTime(dto.getFecha());
            cad = obtenerEstadoCadena(dto) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.hace") + " " + UtilCore.Fecha.diferenciaDiasFechas(dto.getFecha(), UtilCore.Fecha.obtenerFechaActualDate()) + " " + UtilCore.Internacionalizacion.getMensajeInternacional("general.label.dias");
        }
        return cad;
    }
    
    public String obtenerEstadoCadena(PedidoCompraDto dto) {
        String cad = "";
        if (dto.getFecha().after(dto.getFechaCreacion())) {
            if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ELABORACION)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.modificado");
            }
            else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ANULADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.anulado");
            }
            else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_RECHAZADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.rechazado");
            }
            else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO)) {
                cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.confirmado");
            }
        }
        else {
            cad = UtilCore.Internacionalizacion.getMensajeInternacional("general.label.creado");
        }
        return cad;
    }
    
    public String obtenerDiaSemanaTexto(int dia) {
        String[] diasSemana = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.domingo.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.lunes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.martes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.miercoles.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.jueves.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.viernes.a.las"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.sabado.a.las")
        };
        return diasSemana[dia-1];
    }
    
    public String obtenerMesTexto(int mes) {
        String[] meses = {
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.enero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.febrero"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.marzo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.abril"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.mayo"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.junio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.julio"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.agosto"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.setiembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.octubre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.noviembre"),
            UtilCore.Internacionalizacion.getMensajeInternacional("general.label.diciembre")            
        };
        return meses[mes];
    }

    public void definirCssPorEstado(PedidoCompraDto dto) {
        if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ELABORACION)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssElaboracion);
        } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_RECHAZADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssRechazado);
        } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ANULADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssAnulado);
        } else if (dto.getEstado().equals(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO)) {
            dto.setInlinestyle(ConstantesCore.cssEstados.cssConfirmado);
        }
    }

    //No debe repetirse la combinacion {nroSerie-numero}
    public Boolean verificarUniqueNroSerieNumero(PedidoCompraDto dto) {
        try {
            List<PedidoCompraDto> lst = obtenerPedidosPorNroSerieNumero(dto);
            System.out.println(lst);
            if (lst != null) {
                if (!lst.isEmpty()) {
                    recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.nroserie.numero.duplicado"));
                    return false;
                }
            }
        } catch (Exception ex) {
            recursosManager.showError("aqui" + ex.getMessage());
            logger.error(ex.getMessage());
        }
        return true;
    }

    public Boolean verificarDetalles(PedidoCompraDto dto) {
        if (dto.getListaDetalles() != null) {
            if (!dto.getListaDetalles().isEmpty() && dto.getListaDetalles().size() > 0) {
                return true;
            } else {
                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.detalles"));
            }
        } else {
            recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.detalles"));
        }
        return false;
    }

    public SelectItem[] siTiposPedidoCompraTodos() {
        SelectItem[] si = new SelectItem[5];
        si[0] = new SelectItem(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ELABORACION, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DESC_ESTADO_ELABORACION);
        si[1] = new SelectItem(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_ANULADO, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DESC_ESTADO_ANULADO);
        si[2] = new SelectItem(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DESC_ESTADO_CONFIRMADO);
        si[3] = new SelectItem(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_RECHAZADO, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DESC_ESTADO_RECHAZADO);
        si[4] = new SelectItem(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_TODOS, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DESC_ESTADO_TODOS);
        return si;
    }

    public SelectItem[] siDocTransaccion() {
        SelectItem[] si = new SelectItem[1];
        si[0] = new SelectItem(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_DOCTRANSAC_OC, ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DESC_DOCTRANSAC_OC);
        return si;
    }

    public Boolean guardarPedidosCompra(List<PedidoCompraDto> listaNecesidadesPedido) {
        Boolean flag = true;
        try {
            SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
            SolicitudCompraDetaManager solicitudCompraDetaManager = (SolicitudCompraDetaManager) WebServletContextListener.getApplicationContext().getBean("solicitudCompraDetaManager");
            BigDecimal subTotal;
            int count;

            for (PedidoCompraDto padre : listaNecesidadesPedido) {
                if (verificarUniqueNroSerieNumero(padre)) {
                    subTotal = BigDecimal.ZERO;
                    count = 0;
                    for (PedidoCompraDetaDto hijo : padre.getListaDetalles()) {
                        hijo.setIsSave(Boolean.TRUE);
                        count++;
                        hijo.setItem(count);
                        TipoCambioDto tcDto = verificarMonedas(hijo, padre);
                        if (tcDto == null) {
                            hijo.setTipoCambioDto(null);
                            hijo.setFactorConversion(null);
                            hijo.setIsSave(Boolean.FALSE);
                            flag = false;
                            recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.tipo.cambio.prod") + " " + padre.getNumPCTexto() + " / " + hijo.getProductoDetaDto().getProductoDto().getDescripcion());
                        } else if (tcDto.getId().equals(-1L)) {
                            hijo.setTipoCambioDto(null);
                            hijo.setFactorConversion(null);
                            hijo.setPrecioUnitarioD(hijo.getPrecioUnitarioO());
                        } else {
                            hijo.setTipoCambioDto(tcDto);
                            hijo.setFactorConversion(tcDto.getFactor());
                            hijo.setPrecioUnitarioD(hijo.getPrecioUnitarioO().multiply(tcDto.getFactor()));
                        }
                        if (hijo.getPrecioUnitarioD() != null) {
                            hijo.setDescuentoMonto(UtilCore.Numero.dividir(hijo.getPrecioUnitarioD().multiply(hijo.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
                            hijo.setPrecioUnitarioF(hijo.getPrecioUnitarioD().subtract(hijo.getDescuentoMonto()));
                            hijo.setSubTotal(hijo.getPrecioUnitarioF().multiply(hijo.getCantidad()));
                            //SUMAMOS LOS SUBTOTALES
                            subTotal = subTotal.add(hijo.getSubTotal());
                        }
                        hijo.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DETA_COD_ESTADO_EN_ESPERA);
                        hijo.setPedidoCompraDto(padre);
                        if (hijo.getListaDetalles() != null) {
                            for (PcDetaItemDto item : hijo.getListaDetalles()) {
                                item.setPedidoCompraDetaDto(hijo);
                            }
                        }
                    }
                    padre.setSubTotal(subTotal);
                    padre = recalcularMontos(padre);
                    padre.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
                    padre.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                    padre.setTerminal(sessionMBean.getSessionTerminal());
                    padre.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                    padre.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                    padre.setTerminalCreacion(sessionMBean.getSessionTerminal());
                    padre.setProviene(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_PROVIENE_NP);
                    if (padre.getConfirmar()) {
                        padre.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_ESTADO_CONFIRMADO);
                        padre.setUsuarioConfirmacionDto(sessionMBean.getSessionUsuarioDto());
                        padre.setFechaConfirmacion(UtilCore.Fecha.obtenerFechaActualDate());
                    }
                    UtilCore.General.toUpperCaseDto(padre);

                } else {
                    flag = false;
                }
            }
            System.out.println("FLAG--> " + flag);
            if (flag) {
                nuevoMuchos(listaNecesidadesPedido);
                //Guardamos las referencias entre los detalle
                List<SolicitudCompraDetaDto> lstScdDto = new ArrayList<SolicitudCompraDetaDto>();
                for (PedidoCompraDto x : listaNecesidadesPedido) {
                    for (PedidoCompraDetaDto y : x.getListaDetalles()) {
                        for (PcDetaItemDto z : y.getListaDetalles()) {
                            SolicitudCompraDetaDto scdDto = solicitudCompraDetaManager.obtenerPorId(z.getSolicitudCompraDetaDto().getId());
                            scdDto.setPedidoCompraDetaDto(z.getPedidoCompraDetaDto());
                            lstScdDto.add(scdDto);
                        }
                    }
                }
                solicitudCompraDetaManager.nuevoMuchos(lstScdDto);
            }

        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
        return flag;
    }

    public PedidoCompraDto generarDatosPedidoCompra(SolicitudCompraDto sDto) {
        PedidoCompraDto pcDto = inicializar();
        pcDto.setProviene(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_COD_PROVIENE_SC);
        pcDto.setListaDetalles(new ArrayList<PedidoCompraDetaDto>());
        pcDto.setSolicitudCompraDto(sDto);

        PedidoCompraDetaDto pcdDto = null;
        int count = 0;
        BigDecimal subTotal = BigDecimal.ZERO;
        for (SolicitudCompraDetaDto x : sDto.getListaDetalles()) {
            count++;
            pcdDto = new PedidoCompraDetaDto();
            pcdDto.setIsSave(Boolean.TRUE);
            pcdDto.setItem(count);
            pcdDto.setProductoDetaDto(x.getProductoDetaDto());
            pcdDto.setUnidadMedidaDto(x.getUnidadMedidaDto());
            pcdDto.setCantidad(x.getCantidad());
            pcdDto.setPrecioUnitarioO(x.getPrecioTarifa());
            pcdDto.setMonedaDto(x.getMonedaDto());
            pcdDto.setTarifaDto(x.getTarifaDto());
            TipoCambioDto tcDto = verificarMonedas(pcdDto, pcDto);
            if (tcDto == null) {
                pcdDto.setTipoCambioDto(null);
                pcdDto.setFactorConversion(null);
                pcdDto.setIsSave(Boolean.FALSE);
                recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.tipo.cambio.prod") + " " + pcdDto.getProductoDetaDto().getProductoDto().getDescripcion());
            } else if (tcDto.getId().equals(-1L)) {
                pcdDto.setTipoCambioDto(null);
                pcdDto.setFactorConversion(null);
                pcdDto.setPrecioUnitarioD(pcdDto.getPrecioUnitarioO());
            } else {
                pcdDto.setTipoCambioDto(tcDto);
                pcdDto.setFactorConversion(tcDto.getFactor());
                pcdDto.setPrecioUnitarioD(pcdDto.getPrecioUnitarioO().multiply(tcDto.getFactor()));
            }
            pcdDto.setDescuento(x.getDescuento());
            if (pcdDto.getPrecioUnitarioD() != null) {
                pcdDto.setDescuentoMonto(UtilCore.Numero.dividir(pcdDto.getPrecioUnitarioD().multiply(pcdDto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
                pcdDto.setPrecioUnitarioF(pcdDto.getPrecioUnitarioD().subtract(pcdDto.getDescuentoMonto()));
                pcdDto.setSubTotal(pcdDto.getPrecioUnitarioF().multiply(pcdDto.getCantidad()));
                //SUMAMOS LOS SUBTOTALES
                subTotal = subTotal.add(pcdDto.getSubTotal());
            }
            pcdDto.setEstado(ConstantesComp.ValoresConstantes.PEDIDO_COMPRA_DETA_COD_ESTADO_EN_ESPERA);
            pcdDto.setSolicitudCompraDetaDto(x);
            pcDto.getListaDetalles().add(pcdDto);
        }
        pcDto.setSubTotal(subTotal);
        pcDto = recalcularMontos(pcDto);
        return pcDto;
    }

    public List<TerceroDireccionDto> obtenerDireccionesPrincipales(List<TerceroDireccionDto> lst) {
        List<TerceroDireccionDto> lstAux = new ArrayList<TerceroDireccionDto>();
        for (TerceroDireccionDto x : lst) {
            if (x.getPrincipal()) {
                lstAux.add(x);
            }
        }
        return lstAux;
    }

    public BigDecimal obtenerDescuentoPorProveedor(TerceroDto dto) {
        TerceroDescuentoManager terceroDescuentoManager = (TerceroDescuentoManager) WebServletContextListener.getApplicationContext().getBean("terceroDescuentoManager");
        return terceroDescuentoManager.obtenerDescuentoProveedor(dto);
    }

    public PedidoCompraDto recalculardatosPorMoneda(PedidoCompraDto dto) {
        List<PedidoCompraDetaDto> lstDetalles = new ArrayList<PedidoCompraDetaDto>();
        BigDecimal subTotal = BigDecimal.ZERO;
        PedidoCompraDetaDto pcDto = null;
        for (int i = 0; i < dto.getListaDetalles().size(); i++) {
            pcDto = realizarConversionYCalculoMontos(dto.getListaDetalles().get(i), dto);
            subTotal = subTotal.add(pcDto.getSubTotal());
            lstDetalles.add(pcDto);
        }
        dto.setListaDetalles(lstDetalles);
        dto.setSubTotal(subTotal);
        dto = recalcularMontos(dto);
        return dto;
    }

    public BigDecimal sumarSubTotalesDetalle(PedidoCompraDto dto) {
        BigDecimal suma = BigDecimal.ZERO;
        for (PedidoCompraDetaDto x : dto.getListaDetalles()) {
            suma = suma.add(x.getSubTotal());
        }
        return suma;
    }

    public Boolean verificarEliminarDetalle(PedidoCompraDto dto) {
        if (dto.getSolicitudCompraDto() != null) {
            if (dto.getListaDetalles().size() == 1) {
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("general.mensaje.eliminar.deta.origenes.ped.comp"));
                return false;
            }
        }
        return true;
    }

    public PedidoCompraDto recalcularMontos(PedidoCompraDto dto) {
        if (dto.getSubTotal() != null && dto.getDescuento() != null) {
            dto.setDescuentoMonto(UtilCore.Numero.dividir(dto.getSubTotal().multiply(dto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
            dto.setSubTotalConDescuento(dto.getSubTotal().subtract(dto.getDescuentoMonto()));
        }
        if (dto.getImpuesto() != null && dto.getSubTotalConDescuento() != null) {
            dto.setImpuestoMonto(UtilCore.Numero.dividir(dto.getSubTotalConDescuento().multiply(dto.getImpuesto()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
            dto.setTotal(dto.getSubTotalConDescuento().add(dto.getImpuestoMonto()));
            dto.setTotalTexto(UtilCore.ConvertirNumeroATexto.convertNumberToLetter(dto.getTotal().doubleValue(), dto.getMonedaDto().getDescripcionTransac()));

        }
        return dto;
    }

    public PedidoCompraDetaDto unificarDatosPedidoCompraDetalle(PedidoCompraDetaDto pcdDto, PedidoCompraDto pDto) {
        TarifaProductoManager tarifaProductoManager = (TarifaProductoManager) WebServletContextListener.getApplicationContext().getBean("tarifaProductoManager");
        try {
            //Activamos el flag del producto
            pcdDto.setIsSave(Boolean.TRUE);
            TarifaProductoDto tpDto = tarifaProductoManager.obtenerTarifaProductoVigenteAuxiliar(pcdDto.getProductoDetaDto());
            if (tpDto != null) {
                pcdDto.setTarifaDto(tpDto.getTarifaDto());
                pcdDto.setMonedaDto(tpDto.getMonedaCompraDto());
                pcdDto.setPrecioUnitarioO(tpDto.getMontoCompra());
            } else {
                pcdDto.setTarifaDto(null);
                pcdDto.setMonedaDto(pcdDto.getProductoDetaDto().getMonedaCompraDto());
                pcdDto.setPrecioUnitarioO(pcdDto.getProductoDetaDto().getPrecioCompra());
                recursosManager.showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("sol.copmra.deta.mensaje.no.tarifa.prod"));
            }
            pcdDto.setDescuento(pcdDto.getProductoDetaDto().getDescuentoCompra());
            pcdDto = realizarConversionYCalculoMontos(pcdDto, pDto);
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
        return pcdDto;
    }

    /**
     * Metodo que realiza la conversion de montos de acuerdo al tipo de cambio
     *
     * @param pcdDto
     * @param pDto
     * @return Pedido Compra Deta
     */
    public PedidoCompraDetaDto realizarConversionYCalculoMontos(PedidoCompraDetaDto pcdDto, PedidoCompraDto pDto) {
        pcdDto.setIsSave(Boolean.TRUE);
        //Verificamos si es necesario aplicar el tipo de cambio
        TipoCambioDto tcDto = verificarMonedas(pcdDto, pDto);
        if (tcDto == null) {
            pcdDto.setTipoCambioDto(null);
            pcdDto.setFactorConversion(null);
            pcdDto.setIsSave(Boolean.FALSE);
            recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.mensaje.no.tipo.cambio.prod") + " : " + pcdDto.getProductoDetaDto().getProductoDto().getDescripcion());
        } else if (tcDto.getId().equals(-1L)) {
            pcdDto.setTipoCambioDto(null);
            pcdDto.setFactorConversion(null);
            pcdDto.setPrecioUnitarioD(pcdDto.getPrecioUnitarioO());
            pcdDto.setDescuentoMonto(UtilCore.Numero.dividir(pcdDto.getPrecioUnitarioD().multiply(pcdDto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
        } else {
            pcdDto.setTipoCambioDto(tcDto);
            pcdDto.setFactorConversion(tcDto.getFactor());
            pcdDto.setPrecioUnitarioD(pcdDto.getPrecioUnitarioO().multiply(tcDto.getFactor()));
            pcdDto.setDescuentoMonto(UtilCore.Numero.dividir(pcdDto.getPrecioUnitarioD().multiply(pcdDto.getDescuento()), BigDecimal.valueOf(Long.valueOf("100")), applicationMBean.getPrecisionDecimales()));
        }
        pcdDto.setPrecioUnitarioF(pcdDto.getPrecioUnitarioD().subtract(pcdDto.getDescuentoMonto()));
        pcdDto.setUnidadMedidaDto(pcdDto.getProductoDetaDto().getUnidadMedidaDto());
        pcdDto.setSubTotal(pcdDto.getPrecioUnitarioF().multiply(pcdDto.getCantidad()));
        return pcdDto;
    }

    /**
     * Metodo que obtiene el tipo de cambio
     *
     * @param pcdDto
     * @param pDto
     * @return Tipo de Cambio
     */
    public TipoCambioDto verificarMonedas(PedidoCompraDetaDto pcdDto, PedidoCompraDto pDto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        TipoCambioManager tipoCambioManager = (TipoCambioManager) WebServletContextListener.getApplicationContext().getBean("tipoCambioManager");
        TipoCambioDto tcDto = null;
        //Verificamos si es necesario usar el tipo de cambio
        if (!pcdDto.getMonedaDto().getId().equals(pDto.getMonedaDto().getId())) {
            tcDto = tipoCambioManager.obtenerFactorConversionProceso(pcdDto.getMonedaDto(), pDto.getMonedaDto(), sessionMBean.getOrganizacionDto().getTcCompra(), 1);

            if (tcDto.getId() == null) {
                return null;
            }
        } else {
            tcDto = new TipoCambioDto(-1L);
        }
        return tcDto;
    }

    public List<PedidoCompraDto> anadirItems(List<PedidoCompraDto> listaNecesidadPedido, SolicitudCompraDetaDto[] selectedSolCompraDetaDto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        if (sessionMBean.getOrganizacionDto() != null) {
            if (listaNecesidadPedido == null) {
                listaNecesidadPedido = new ArrayList<PedidoCompraDto>();
            }
            PedidoCompraDto pcDtoAux;
            PedidoCompraDto pcDto;
            PedidoCompraDetaDto pcdDto;
            PedidoCompraDetaDto pcdDtoAux;
            PcDetaItemDto pcDetaItemDto;
            for (SolicitudCompraDetaDto x : selectedSolCompraDetaDto) {
                if (!sessionMBean.getOrganizacionDto().getNumPC()) {
                    if (listaNecesidadPedido.isEmpty()) {
                        pcDto = inicializar();
                        pcDto.setProveedorDto(null);
                        pcDto.setListaDetalles(new ArrayList<PedidoCompraDetaDto>());
                        listaNecesidadPedido.add(pcDto);
                    }
                }
                //Verificamos si es de un proveedor distinto
                pcDtoAux = verificarMismoProveedor(listaNecesidadPedido, x);
                if (pcDtoAux == null) {//Si es de un proveedor diferente                    
                    pcDto = inicializar();
                    pcDto.setProveedorDto(x.getProveedorDto());
                    pcDto.setListaDetalles(new ArrayList<PedidoCompraDetaDto>());
                    pcdDto = inicializarItemNecesidadPedido(x);
                    //Agregamos el detalle en la tabla PCDetaItem
                    pcDetaItemDto = new PcDetaItemDto();
                    pcDetaItemDto.setSolicitudCompraDetaDto(x);
                    pcDetaItemDto.setCantidad(pcdDto.getCantidad());
                    pcdDto.getListaDetalles().add(pcDetaItemDto);
                    pcDto.getListaDetalles().add(pcdDto);
                    listaNecesidadPedido.add(pcDto);
                } else {//Si ya existe un PC con el mismo Proveedor
                    pcDto = pcDtoAux;
                    pcDto.setConfirmar(Boolean.FALSE);
                    //Verificamos si en los detalle del PC ya existe este Producto
                    int index = verificarMismoProducto(pcDto, x);
                    if (index == -1) {//Es un nuevo producto
                        pcdDto = inicializarItemNecesidadPedido(x);
                        //Agregamos el detalle en la tabla PCDetaItem
                        pcDetaItemDto = new PcDetaItemDto();
                        pcDetaItemDto.setSolicitudCompraDetaDto(x);
                        pcDetaItemDto.setCantidad(x.getCantidad());
                        pcdDto.getListaDetalles().add(pcDetaItemDto);
                        pcDto.getListaDetalles().add(pcdDto);
                    } else {//El producto ya existe
                        pcDetaItemDto = new PcDetaItemDto();
                        pcDetaItemDto.setSolicitudCompraDetaDto(x);
                        pcDetaItemDto.setCantidad(x.getCantidad());
                        pcDto.getListaDetalles().get(index).getListaDetalles().add(pcDetaItemDto);
                        pcDto.getListaDetalles().get(index).setCantidad(pcDto.getListaDetalles().get(index).getCantidad().add(x.getCantidad()));
                        pcDto.getListaDetalles().get(index).setSolicitudCompraDetaDto(null);
                    }
                }

            }
        }
        return listaNecesidadPedido;
    }

    public List<SolicitudCompraDetaDto> quitarItemsYaSeleccionados(List<SolicitudCompraDetaDto> lstSol, List<PedidoCompraDto> lstPcDto) {
        List<SolicitudCompraDetaDto> resultado = new ArrayList<SolicitudCompraDetaDto>();
        Boolean indicador = false;
        for (SolicitudCompraDetaDto solDeta : lstSol) {
            indicador = false;
            for (PedidoCompraDto padre : lstPcDto) {
                for (PedidoCompraDetaDto hijo : padre.getListaDetalles()) {
                    if (hijo.getSolicitudCompraDetaDto() != null) {
                        if (solDeta.equals(hijo.getSolicitudCompraDetaDto())) {
                            indicador = true;
                        }
                    } else {
                        for (PcDetaItemDto item : hijo.getListaDetalles()) {
                            if (solDeta.equals(item.getSolicitudCompraDetaDto())) {
                                indicador = true;
                            }
                        }
                    }
                }
            }

            if (!indicador) {
                resultado.add(solDeta);
            }
        }
        return resultado;
    }

    public List<PedidoCompraDto> quitarItem(List<PedidoCompraDto> lst, PedidoCompraDetaDto pcdDto, int index) {
        for (int i = 0; i < lst.get(index).getListaDetalles().size(); i++) {
            if (lst.get(index).getListaDetalles().get(i).getProductoDetaDto().equals(pcdDto.getProductoDetaDto())) {
                lst.get(index).getListaDetalles().remove(i);
            }
        }
        if (lst.get(index).getListaDetalles().isEmpty()) {
            lst.remove(index);
        }
        return lst;
    }

    private PedidoCompraDetaDto inicializarItemNecesidadPedido(SolicitudCompraDetaDto scdDto) {
        PedidoCompraDetaManager pedidoCompraDetaManager = (PedidoCompraDetaManager) WebServletContextListener.getApplicationContext().getBean("pedidoCompraDetaManager");
        PedidoCompraDetaDto pcdDto = pedidoCompraDetaManager.inicializar();
        pcdDto.setProductoDetaDto(scdDto.getProductoDetaDto());
        pcdDto.setUnidadMedidaDto(scdDto.getUnidadMedidaDto());
        pcdDto.setCantidad(scdDto.getCantidad());
        pcdDto.setPrecioUnitarioO(scdDto.getPrecioTarifa());
        pcdDto.setMonedaDto(scdDto.getMonedaDto());
        pcdDto.setSolicitudCompraDetaDto(scdDto);
        pcdDto.setTarifaDto(scdDto.getTarifaDto());
        pcdDto.setDescuento(scdDto.getDescuento());
        pcdDto.setListaDetalles(new ArrayList<PcDetaItemDto>());
        return pcdDto;
    }

    private int verificarMismoProducto(PedidoCompraDto pcDto, SolicitudCompraDetaDto scdDto) {
        int index = -1;
        PedidoCompraDetaDto pcdDto;
        for (int i = 0; i < pcDto.getListaDetalles().size(); i++) {
            pcdDto = pcDto.getListaDetalles().get(i);
            if (pcdDto.getProductoDetaDto().equals(scdDto.getProductoDetaDto())) {
                index = i;
            }
        }
        return index;
    }

    private PedidoCompraDto verificarMismoProveedor(List<PedidoCompraDto> listaNecesidadPedido, SolicitudCompraDetaDto scdDto) {
        PedidoCompraDto result = null;
        for (PedidoCompraDto x : listaNecesidadPedido) {
            if (x.getProveedorDto() == null) {//Si es null se trata de una org que solo genera un PC
                return x;
            }
            if (x.getProveedorDto().equals(scdDto.getProveedorDto())) {
                result = x;
            }
        }
        return result;
    }

    public List<PedidoCompraDto> generarNumPCTexto(List<PedidoCompraDto> listaNecesidadPedido) {

        for (int i = 0; i < listaNecesidadPedido.size(); i++) {
            listaNecesidadPedido.get(i).setNumPCTexto(UtilCore.Internacionalizacion.getMensajeInternacional("key.entidad.pedido.compra.abrev") + " - " + (i + 1));
        }
        return listaNecesidadPedido;
    }

    public List<PedidoCompraDto> obtenerDescuentosPorProveedor(List<PedidoCompraDto> listaNecesidadPedido) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        if (sessionMBean.getOrganizacionDto().getNumPC()) {
            //Calculamos el descuento por proveedor
            BigDecimal descuento = BigDecimal.ZERO;
            for (PedidoCompraDto padre : listaNecesidadPedido) {
                descuento = obtenerDescuentoPorProveedor(padre.getProveedorDto());
                if (descuento != null) {
                    padre.setDescuento(descuento);
                }
            }
        }
        return listaNecesidadPedido;
    }

    public void reordenarDetalles(PedidoCompraDto dto) {
        List<PedidoCompraDetaDto> lstDetalles = dto.getListaDetalles();
        PedidoCompraDetaManager pedidoCompraDetaManager = (PedidoCompraDetaManager) WebServletContextListener.getApplicationContext().getBean("pedidoCompraDetaManager");
        try {
            UtilCore.General.ordena(lstDetalles, "item");
            int count = 0;
            for (PedidoCompraDetaDto d : lstDetalles) {
                count++;
                d.setItem(count);
            }
            if (dto.getId() != null) {
                pedidoCompraDetaManager.nuevoMuchos(lstDetalles);
            }
        } catch (Exception ex) {
            recursosManager.showError(ex.getMessage());
            logger.error(ex.getMessage());
        }
    }

    public String imprimirDto(PedidoCompraDto dto) {
        try {
            String nombreArchivoReporte = "ERP_PEDIDO_COMPRA_NRO_" + dto.getId();
            HashMap parametros = new HashMap();
            parametros.put("P_IDENTIFICADOR", dto.getId());
            recursosManager.viewReportePdf(parametros, "JPedidoCompra", nombreArchivoReporte);
            return null;
        } catch (FileNotFoundException ex) {
            recursosManager.showError("EL ARCHIVO NO SE ENCUENTRA");
            logger.error(ex);
        } catch (JRException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA COMPILACIÓN DEL REPORTE");
        } catch (IOException ex) {
            recursosManager.showError("EL ARCHIVO ESTÁ DAÑADO");
            logger.error(ex);
        } catch (SQLException ex) {
            logger.error(ex);
            recursosManager.showError("ERROR EN LA CONSULTA DEL REPORTE");
        } finally {
            return null;
        }
    }

    public void generarExcelSeleccionados(ExportarExcelCompras.PedidoCompra exp, PedidoCompraDto[] selectedPCs) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List<PedidoCompraDto> lst = Arrays.asList(selectedPCs);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lst);
        String nombreArchivo = "PEDIDOS_COMPRA_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }

    public void generarExcelPorTabla(ExportarExcelCompras.PedidoCompra exp, List<PedidoCompraDto> lstPC) {
        StringBuilder strCabecera = this.obtenerCabeceraExcel(exp);
        List lstCuerpo = this.obtenerCuerpoExcel(exp, lstPC);
        String nombreArchivo = "PEDIDOS_COMPRA_" + UtilCore.Fecha.obtenerFechaHoraActual().replace(':', '_') + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }

    private List obtenerCuerpoExcel(ExportarExcelCompras.PedidoCompra exp, List<PedidoCompraDto> lst) {
        StringBuilder strCuerpo;
        List lstFilas = new ArrayList();
        for (PedidoCompraDto x : lst) {
            strCuerpo = new StringBuilder();
            if (exp.getId()) {
                strCuerpo.append(x.getId()).append("|");
            }
            if (exp.getEmpresa()) {
                strCuerpo.append(x.getEmpresaDto().getDescripcion()).append("|");
            }
            if (exp.getOrganizacion()) {
                strCuerpo.append(x.getOrganizacionDto().getNombre()).append("|");
            }
            if (exp.getFechaPedido()) {
                strCuerpo.append(x.getFechaPedido()).append("|");
            }
            if (exp.getProveedor()) {
                strCuerpo.append(x.getProveedorDto().getDescripcion()).append("|");
            }
            if (exp.getDireccion()) {
                if (x.getDireccion() != null) {
                    strCuerpo.append(x.getDireccion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getAlmacen()) {
                strCuerpo.append(x.getAlmacenDto().getNombre()).append("|");
            }
            if (exp.getFechaComprometida()) {
                strCuerpo.append(x.getFechaComprometida()).append("|");
            }
            if (exp.getFormaPago()) {
                strCuerpo.append(x.getFormaPagoDto().getDescripcion()).append("|");
            }
            if (exp.getCondicionPago()) {
                strCuerpo.append(x.getCondicionPagoDto().getDescripcion()).append("|");
            }
            if (exp.getTarifa()) {
                strCuerpo.append(x.getTarifaDto().getNombre()).append("|");
            }
            if (exp.getUsuarioCreacion()) {
                strCuerpo.append(x.getUsuarioCreacionDto().getDescripcion()).append("|");
            }
            if (exp.getFechaCreacion()) {
                strCuerpo.append(x.getFechaCreacion()).append("|");
            }
            if (exp.getTerminalCreacion()) {
                strCuerpo.append(x.getTerminalCreacion()).append("|");
            }
            if (exp.getUsuarioConfirmacion()) {
                if (x.getUsuarioConfirmacionDto() != null) {
                    strCuerpo.append(x.getUsuarioConfirmacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaConfirmacion()) {
                if (x.getFechaConfirmacion() != null) {
                    strCuerpo.append(x.getFechaConfirmacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioAnulacion()) {
                if (x.getUsuarioAnulacionDto() != null) {
                    strCuerpo.append(x.getUsuarioAnulacionDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaAnulacion()) {
                if (x.getFechaAnulacion() != null) {
                    strCuerpo.append(x.getFechaAnulacion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getUsuarioRechazo()) {
                if (x.getUsuarioRechazoDto() != null) {
                    strCuerpo.append(x.getUsuarioRechazoDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getFechaRechazo()) {
                if (x.getFechaRechazo() != null) {
                    strCuerpo.append(x.getFechaRechazo()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            if (exp.getProviene()) {
                strCuerpo.append(x.getProvieneTexto()).append("|");
            }

            if (exp.getMoneda()) {
                strCuerpo.append(x.getMonedaDto().getDescripcion()).append("|");
            }

            if (exp.getSubTotal()) {
                strCuerpo.append(x.getSubTotal()).append("|");
            }

            if (exp.getDescuento()) {
                strCuerpo.append(x.getDescuento()).append("|");
            }

            if (exp.getDescuentoMonto()) {
                strCuerpo.append(x.getDescuentoMonto()).append("|");
            }

            if (exp.getSubTotalConDescuento()) {
                strCuerpo.append(x.getSubTotalConDescuento()).append("|");
            }

            if (exp.getImpuesto()) {
                strCuerpo.append(x.getImpuesto()).append("|");
            }

            if (exp.getImpuestoMonto()) {
                strCuerpo.append(x.getImpuestoMonto()).append("|");
            }

            if (exp.getTotal()) {
                strCuerpo.append(x.getTotal()).append("|");
            }

            if (exp.getTotalTexto()) {
                strCuerpo.append(x.getTotalTexto()).append("|");
            }

            if (exp.getSolicitudCompra()) {
                if (x.getSolicitudCompraDto() != null) {
                    strCuerpo.append(x.getSolicitudCompraDto().getId()).append(" / ").append(x.getSolicitudCompraDto().getDescripcion()).append("|");
                } else {
                    strCuerpo.append("-").append("|");
                }
            }
            lstFilas.add(strCuerpo.toString());
        }
        return lstFilas;
    }

    private StringBuilder obtenerCabeceraExcel(ExportarExcelCompras.PedidoCompra exp) {
        StringBuilder strCabecera = new StringBuilder();
        if (exp.getId()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.id")).append("|");
        }
        if (exp.getEmpresa()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.empresa")).append("|");
        }
        if (exp.getOrganizacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.organizacion")).append("|");
        }
        if (exp.getFechaPedido()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.fecha.pedido")).append("|");
        }
        if (exp.getProveedor()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.proveedor")).append("|");
        }
        if (exp.getDireccion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.direccion")).append("|");
        }
        if (exp.getAlmacen()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.almacen")).append("|");
        }
        if (exp.getFechaComprometida()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.fecha.comprometida")).append("|");
        }
        if (exp.getFormaPago()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.forma.pago")).append("|");
        }
        if (exp.getCondicionPago()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.condicion.pago")).append("|");
        }
        if (exp.getTarifa()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.tarifa")).append("|");
        }
        if (exp.getUsuarioCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.usuario.creacion")).append("|");
        }
        if (exp.getFechaCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.fecha.creacion")).append("|");
        }
        if (exp.getTerminalCreacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("general.label.terminal.creacion")).append("|");
        }
        if (exp.getUsuarioConfirmacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.usuario.confirmacion")).append("|");
        }
        if (exp.getFechaConfirmacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.fecha.confirmacion")).append("|");
        }
        if (exp.getUsuarioAnulacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.usuario.anulacion")).append("|");
        }
        if (exp.getFechaAnulacion()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.fecha.anulacion")).append("|");
        }
        if (exp.getUsuarioRechazo()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.usuario.rechazo")).append("|");
        }
        if (exp.getFechaRechazo()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.fecha.rechazo")).append("|");
        }
        if (exp.getProviene()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.proviene")).append("|");
        }

        if (exp.getMoneda()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.moneda")).append("|");
        }

        if (exp.getSubTotal()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.sub.total")).append("|");
        }

        if (exp.getDescuento()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.descuento")).append("|");
        }

        if (exp.getDescuentoMonto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.descuento.monto")).append("|");
        }

        if (exp.getSubTotalConDescuento()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.subtot.con.descuento")).append("|");
        }

        if (exp.getImpuesto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.impuesto")).append("|");
        }

        if (exp.getImpuestoMonto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.impuesto.monto")).append("|");
        }

        if (exp.getTotal()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.total")).append("|");
        }

        if (exp.getTotalTexto()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.total.texto")).append("|");
        }

        if (exp.getSolicitudCompra()) {
            strCabecera.append(UtilCore.Internacionalizacion.getMensajeInternacional("pedido.compra.sol.compra")).append("|");
        }
        return strCabecera;
    }

    public ExportarExcelCompras.PedidoCompra onChangeChekExcel(Boolean flag) {
        return new ExportarExcelCompras.PedidoCompra(flag);
    }

    public void nuevoMuchos(List<PedidoCompraDto> lista) throws DAOException {
        springHibernateDao.guardarColeccion(lista);
    }

    public void eliminarMuchos(List<PedidoCompraDto> lista) throws DAOException {
        springHibernateDao.borrarColeccion(lista);
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        PedidoCompraManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<PedidoCompraDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<PedidoCompraDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }

    public String getUrlListaSolicitudes() {
        return urlListaSolicitudes;
    }

    public String getUrlNecesidadPedido() {
        return urlNecesidadPedido;
    }
}
